// 购物车vuex模块
export default {
    // 为该模块开启命名空间
    namespaced: true,
    // 该模块的数据节点
    state: () => ({
        // 存放购物车的每一个商品
        // 每个商品为一个对象 ，每个对象应包含
        //goods_name(商品名称) goods_price(商品价格) goods_small_logo(商品图片) goods_state(商品选中状态) goods_count(商品数量) goods_id属性
        cart: JSON.parse(uni.getStorageSync('cart') || '[]')
    }),
    // 该模块的操作数据的mutations节点
    mutations: {
        // 添加商品到购物车的方法
        addToCart(state, goods) {
            // 寻找添加的这个商品是否已经在购物车里存在
            const findRes = state.cart.find(x => x.goods_id === goods.goods_id)

            if (!findRes) {
                // 如果没有找到 说明购物车里没有这个商品 就把这个商品添加进购物车
                state.cart.push(goods)
            } else {
                // 如果找到了 说明存在 那个这个商品的数量+1即可
                findRes.goods_count++
            }
            // 添加商品后保存最新购物车信息到本地 实际应该保存给后端
            this.commit('m_cart/saveCartToStorage')

        },
        // 保存购物车信息至本地 从后台获取或者添加购物车后都应该调用这个函数 
        saveCartToStorage(state) {
            uni.setStorageSync('cart', JSON.stringify(state.cart))
        },
        // 更新商品选中状态的方法
        updateGoodsState(state, goods) {
            // 根据传过来的商品id找到对应的商品
            const findRes = state.cart.find(x => x.goods_id === goods.goods_id)
            // 找到对应的商品 后 修改选中状态并保存到本地 实际应该保存给后端
            if (findRes) {
                findRes.goods_state = goods.goods_state

                this.commit('m_cart/saveCartToStorage')
            }
        },
        // 更新商品数量的方法
        updateGoodsCount(state, goods) {
            // 根据传过来的商品id找到对应的商品
            const findRes = state.cart.find(x => x.goods_id === goods.goods_id)
            // 找到对应的商品 后 修改商品数量并保存到本地 实际应该保存给后端
            if (findRes) {
                findRes.goods_count = goods.goods_count

                this.commit('m_cart/saveCartToStorage')
            }
        },
        // 删除商品方法
        removeGoods(state, goods) {
            // 原数组内每一项的id不等于传过来的那个商品的id 过滤出来 就把要删除的过滤掉了
            state.cart = state.cart.filter(x => x.goods_id !== goods.goods_id)
            this.commit('m_cart/saveCartToStorage')
        },
        // 全选与取消全选
        checkedAll(state, val) {
            state.cart.forEach(item => item.goods_state = val)
            this.commit('m_cart/saveCartToStorage')
        }
    },
    // 该模块的计算属性节点
    getters: {
        // 计算购物车内的商品总数量
        total(state) {
            let count = 0
            state.cart.forEach(x => count += x.goods_count)
            return count
        },
        // 动态计算已勾选商品的数量
        checkedCount(state) {
            return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_count, 0)
        },
        // 动态计算已勾选商品总价格
        checkedAmmont(state) {
            return state.cart.filter(x => x.goods_state).reduce((total, item) => total += item.goods_price * item
                .goods_count, 0)
        },
        // 根据商品的选择状态 动态计算全选框的选中状态
        allCheckedState(state) {
            return state.cart.every(item => {
                //循环每一项的goods_state 有一项是false 就返回false
                return item.goods_state === true
            })
        }
    }

}
